// es5:apply传入数组，call传入参数
console.log(Math.floor.call(null, 3.72));

// es6:
console.log(Reflect.apply(Math.floor, null, [4.72]))


// Math.ceil
let price = 101.5;
if (price > 100) {
    price = Math.floor.apply(null, [price])
} else {
    price = Math.ceil.apply(null, [price])
}
console.log(price);
// es6 Relect:

var price2 = Reflect.apply(price > 100 ? Math.floor : Math.ceil, null, [price]);
console.log(price2);

// 反射对象：
let d = new Date();
console.log(d.getTime());


let dr = Reflect.construct(Date, []);

console.log(dr.getTime());
console.log(dr instanceof Date)

const student = {

}
// 返回一个对象：
// Object.defineProperty(student, 'name', {
//     value: 'ycd'
// })
// 返回一个布尔值：
const r = Reflect.defineProperty(student, 'name', {
    'value': 'ycd2'
});
console.log(r)

const obj_del = {
    x: 1,
    y: 2
};

Reflect.deleteProperty(obj_del, 'x');
console.log(obj_del);

// 用来读取对象的另一种方法：
console.log(Reflect.get(obj_del, 'y'))


// 读取一个数组索引为1的值:
console.log(Reflect.get([3, 4], 1)); //打印出4


var newObj = {
    x: 1,
    y: 2
}
// 用来检测属性：
console.log(Reflect.getOwnPropertyDescriptor(newObj, 'x'));
console.log(Object.getOwnPropertyDescriptor(newObj, 'x'));

let newd = new Date()
console.log(Reflect.getPrototypeOf(newd));


// 返回一个布尔值来判断对象上是否有某个属性：
// console.log(Object.has(newObj, 'x')) //报错，object没有这个方法
console.log(Reflect.has(newObj, 'x')); //true

// 判断是否是可扩展的：
console.log(Reflect.isExtensible(newObj)); //true
// Object.freeze(newObj);
newObj.z = 3;
console.log(Reflect.isExtensible(newObj)); //false

// 枚举自身属性的方法：
console.log(Reflect.ownKeys(newObj));
console.log(Reflect.ownKeys([1, 2]));


// 让其不可扩展和object freeze一样
// Reflect.preventExtensions(newObj)
Reflect.set(newObj, 'z', 4)
console.log(newObj);

const arr = ['cat', 'dog'];
Reflect.set(arr, 2, 'tt'); //给数组写一新址
console.log(arr)
console.log(Reflect.getPrototypeOf(arr))


Reflect.setPrototypeOf(arr, String.prototype);
// arr.sort() //报错,原型指向改了就没法使用了